// *************** 使用说明 *************** //
// 1. 在main.js中引入该文件
//   import storage from 'path/storage.js'
// 2. 设置引入后的简名，简化在组件中调用时的编译（可选择性操作）
//   Vue.prototype.xx = storage
// 3. 设置该项目中所有缓存在浏览器中的key前缀（可选择性操作）
//   storage.setPrefix('xxoo_')
// 4. 设置存储类型为sessionStorage，如跳过本句或传参其他任意String，存储类型为localStorage（可选择性操作）
//   storage.setStoregeType('sessionStorage')
// ——————————————————————————————————————————————————————————————————————————————以上4点均在main.js中编译
// 5. 存储值至浏览器缓存中，传参方式如下
// ————————————————PS:如果步骤二有设置简名，可使用this.xx.set(obj)
//  this.storage.set({
//   like: ['足球', '上网'],
//   name: 'goudan',
//   stature: 175,
//   single: true,
//   money: null,
//   work: {
//     'seniority': '3',
//     'type': 'yazi'
//   }
// })
// 6. 获取浏览器缓存中的某个key值，传参方式如下
// ————————————————PS:如果步骤二有设置简名，可使用this.xx.get(String)
// this.storage.get('name')
// 7. 删除浏览器缓存中的某个key值，传参方式如下
// ————————————————PS:如果步骤二有设置简名，可使用this.xx.remove(String)
// this.storage.remove('name')
// 8. 删除该类存储类型下所有的Key值，如果设置了prefix前缀，只删除与该前缀相关的key
// ————————————————PS:如果步骤二有设置简名，可使用this.xx.clear(String)
// this.storage.clear()

export default {
  prefix: String,
  storage: window.sessionStorage,
  setPrefix (prefix) {
    let _this = this
    if (!prefix) {
      prefix = ''
    }
    _this.prefix = prefix
  },
  setStoregeType (storegeType) {
    let _this = this
    storegeType = storegeType !== 'sessionStorage' ? window.localStorage : window.sessionStorage
    _this.storage = storegeType
  },
  set (dataObj) {
    let _this = this
    for (var i in dataObj) {
      _this.insertItem(i, dataObj[i])
    }
  },
  insertItem (key, val) {
    let _this = this
    let ls = _this.storage
    key = _this.returnKey(key)
    let valType = typeof (val)
    if (val !== null) {
      var valConstructor = val.constructor
    }
    if (valType === 'string' || valType === 'number' || valType === 'boolean') {
      if (valConstructor === String) {
        val = val + '|String'
      } else if (valConstructor === Number) {
        val = val + '|Number'
      } else if (valConstructor === Boolean) {
        val = val + '|Boolean'
      }
      ls.setItem(key, val)
    } else if (valType === 'object') {
      if (val === null) {
        val = JSON.stringify(val) + '|Null'
        ls.setItem(key, val)
      } else {
        if (valConstructor === Array) {
          val = JSON.stringify(val) + '|Array'
        } else if (valConstructor === Object) {
          val = JSON.stringify(val) + '|Object'
        }
        ls.setItem(key, val)
      }
    }
  },
  get (key) {
    let _this = this
    let ls = _this.storage
    key = _this.returnKey(key)
    let keyVal = ls.getItem(key)
    if (keyVal === null) {
      return null
    }
    let valArr = keyVal.split('|')
    let getDataType = valArr[valArr.length - 1]
    valArr.splice(valArr.length - 1, 1)
    let val = valArr.join('')
    if (getDataType === 'Number') {
      val = parseInt(val)
    } else if (getDataType === 'Boolean') {
      if (val === 'true') {
        val = true
      } else {
        val = false
      }
    } else if (getDataType === 'Array' || getDataType === 'Object' || getDataType === 'Null') {
      val = JSON.parse(val)
    }
    return val
  },
  remove (key) {
    let _this = this
    let ls = _this.storage
    key = _this.returnKey(key)
    ls.removeItem(key)
  },
  clear () {
    let _this = this
    let ls = _this.storage
    let prefix = _this.prefix
    if (prefix) {
      for (var i in ls) {
        if (i.indexOf(prefix) !== -1) {
          ls.removeItem(i)
        }
      }
    } else {
      _this.storage.clear()
    }
  },
  returnKey (key) {
    let prefix = this.prefix
    if (prefix) {
      key = prefix + key
    }
    return key
  }
}
